package com.laity.cas;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * @author: Laity
 * @Project: JavaLaity
 * @Package: com.laity.cas.CasDemo
 * @Date: 2023年12月14日 22:25
 * @Description: CAS
 */

public class CasDemo {

    // CAS 是乐观锁的一种实现方式，它允许一个线程在执行时检查另一个线程是否修改过共享变量，
    // 如果没有被修改过，则执行，如果被修改过，则重试，直到成功为止。
    // CAS 包含三个操作数，内存值 V、预估值 A、更新值 B。如果内存值 V 等于预估值 A，则将内存值修改为 B，否则什么都不做。
    // 这三个操作数必须是原子操作，即在一个时刻只能有一个线程对它们进行操作。
    // CAS 适用于以下情况：
    // 1. 读-改-写操作，如数据库的更新操作。
    // 2. 一个变量在多个线程中需要保持一致性，但每次更新都必须读取变量的值，并检查该值是否等于预期的值，如果是，则将该值设置为新值，否则什么都不做。
    // 3. 一个变量在多个线程中需要保持原子性，即在某个时刻只能有一个线程对其进行操作。
    // 4. 一个变量在多个线程中需要保持可见性，即一个线程修改了某个变量的值，其他线程能够立即看到修改的值。
    // 5. 一个变量在多个线程中需要保持顺序一致性，即在一个线程中，按照顺序依次读取变量的值，所有的值都应该是一样的。
    // 6. 一个变量在多个线程中需要保持单调递增，即每次修改时，变量的值只能递增。
    // 7. 一个变量在多个线程中需要保持单调递减，即每次修改时，变量的值只能递减。
    // 8. 一个变量在多个线程中需要保持一致性，即一个线程修改了某个变量的值，其他线程在读取时必须读取到该变量的最新值。
    // compareAndSet() 比较并交换
    public static void main(String[] args) {
        AtomicInteger atomicInteger = new AtomicInteger(2023);
        /*
    public final boolean compareAndSet(int expect, int update) {
        return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
    }
         */
        // 如果我期望的值达到2023，那么我就将它修改为2021，如果不满足，就不修改。
        atomicInteger.compareAndSet(2023, 2021);
        System.out.println(atomicInteger.get());

        System.out.println(atomicInteger.compareAndSet(2023, 2021));
        atomicInteger.getAndIncrement(); // ++ 操作

    }
}
